package delphorm.service.personne;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import delphorm.entite.personne.Utilisateur;
import delphorm.service.exception.ServiceException;
import delphorm.utils.RandomGeneratorUtils;

/**
 * Bouchon qui utilise des maps
 * @author jerome
 *
 */
public class BouchonPersonne implements IPersonne {

	Map<Long, Utilisateur> utilisateurs = new HashMap<Long, Utilisateur>();

	/**
	 * @return utilisateurs
	 */
	public Map<Long, Utilisateur> getUtilisateurs() {
		return utilisateurs;
	}

	/**
	 * @param utilisateurs
	 *            utilisateurs à modifier
	 */
	public void setUtilisateurs(Map<Long, Utilisateur> utilisateurs) {
		this.utilisateurs = utilisateurs;
	}

	public Utilisateur chercherUtilisateurParId(Long id) {
		return utilisateurs.get(id);
	}

	public Utilisateur chercherUtilisateurParLogin(String login) {
		for (Utilisateur utilisateur : utilisateurs.values()) {
			if (utilisateur.getLogin().equals(login))
				return utilisateur;
		}
		return null;
	}

	public Utilisateur editerUtilisateur(Utilisateur u) throws ServiceException {
		if(u.getId() == null)
		{
			String[] args = {u.toString()};
			throw new ServiceException("L'utilisateur n'a pas d'identifiant",null,"IPersonne","editerUtilisateur",args);
		}
		return utilisateurs.put(u.getId(), u);
	}

	public Utilisateur enregistrerUtilisateur(Utilisateur u) {
		return utilisateurs.put(RandomGeneratorUtils.genererIdentifiant(utilisateurs), u);
	}

	public boolean existeParLogin(String login) {
		for (Utilisateur utilisateur : utilisateurs.values()) {
			if(utilisateur.getLogin().equals(login))
				return true;
		}
		return false;
	}

	public Utilisateur identifierUtilisateur(Utilisateur u)  {
		for (Utilisateur utilisateur : utilisateurs.values()) {
			if(utilisateur.getLogin().equals(u.getLogin()))
				if(utilisateur.getPassword().equals(u.getPassword()))
				{
					utilisateur.calculerDroits();
					return utilisateur;
				} else
					break;
		}
		return null;
	}

	public List<Utilisateur> listerUtilisateurs(String type) {
		//FIXME gérer le tri
		return new ArrayList<Utilisateur>(utilisateurs.values());
	}

	public void supprimerUtilisateurParId(Long id) {
		utilisateurs.remove(id);
	}

}
